What you're setting up, in one breath
cash-kit is a folder of small Python scripts on your Mac. Once a day it asks
SimpleFIN Bridge for your balances and recent transactions, saves them as plain text files
inside that folder, and draws two pages you open locally: today.html (where the money is and where it's heading
over the next five months) and spend-calendar.html (what went out, day by day).
Terminal, in three sentences
- Open it: press ⌘ space, type
Terminal, press return. - Every command on this page has a Copy button. Click it, click in the Terminal window, press ⌘ V, press return.
- Commands that span two lines are meant to be pasted as a pair; the first line just moves you into the kit folder.
The kit folder lives at ~/git/cash-kit (that is, a git folder in your home folder, with cash-kit inside it). Every command on this page is ./cash-kit something, typed from inside that folder; Step 1 gets you there. If yours ends up somewhere else, Step 1 also shows how to point Terminal at it.
Check your Mac
Confirms the Python that ships with macOS is new enough and that the kit is where we expect. Nothing to install.
What it does. cash-kit uses the Python already on every Mac (/usr/bin/python3) with nothing added — no pip, no Homebrew, no downloads. It needs version 3.9 or newer, which macOS 13 (Ventura, 2022) and later provide.
1a — Python version
/usr/bin/python3 --version
Python 3.9.6 (3.9.anything or higher is fine — 3.11, 3.12, 3.13 all good)
Python 3.8 or lower, your macOS is older than this kit expects; update macOS first (Apple menu → System Settings → General → Software Update).1b — The kit folder
Put the kit at ~/git/cash-kit. If you were handed a zip, unzip it and drag the cash-kit folder into a folder called git in your home folder (Finder → Go → Home; make git if it isn't there). If you were given a git address instead, this does the same thing in one line — swap in the address you were given:
mkdir -p ~/git && cd ~/git && git clone <repo-url> cash-kit
Then step inside and ask the kit for its help text:
cd ~/git/cash-kit ./cash-kit
cash-kit — your money, on your Mac, nowhere else. ./cash-kit claim one-time: link your SimpleFIN Bridge — paste the token at the hidden prompt ./cash-kit pull fetch balances + transactions into ledger/inbox ./cash-kit today render today.html ./cash-kit calendar render spend-calendar.html ./cash-kit morning pull + today + calendar (what the daily job runs) ./cash-kit ingest [--dry-run] promote posted feed rows into ledger/transactions.csv ./cash-kit install schedule 'morning' daily at 9:15 via launchd ./cash-kit open open today.html in your browser ./cash-kit status show link + last pull
No such file or directory — the folder isn't at ~/git/cash-kit. Type cd (with the space), then drag the cash-kit folder from Finder into the Terminal window, press return, then run ./cash-kit. Every later command on this page starts with cd ~/git/cash-kit; swap in your path each time, or simply move the folder to ~/git/cash-kit and be done with it.
Permission denied — run chmod +x ~/git/cash-kit/cash-kit ~/git/cash-kit/install.sh once, then try again.
SimpleFIN Bridge — connect your banks, claim your token
The one outside party in this whole setup. $1.50 a month or $15 a year.
What it does. SimpleFIN Bridge is a small paid service that signs in to your banks on your behalf and hands out a read-only copy of balances and transactions. cash-kit never sees a bank password; it only ever talks to the Bridge, and only to read.
Sign up or sign in to SimpleFIN Bridge https://beta-bridge.simplefin.org2a — Account and banks
- Create an account and pay. Your card details go to SimpleFIN's payment page, nobody else.
- Connect each bank: look for Add a connection (or similar), pick your bank, and sign in on the connection screen that appears (that screen belongs to MX, the aggregator SimpleFIN uses; it is the only place your bank password ever goes). If the bank sends you a text-message code, enter it there. Link the bank that holds your main checking account first — the daily page anchors on it. Then add the rest in any order: savings, cards, loans, brokerage. Not sure a bank is supported? Check https://beta-bridge.simplefin.org/search-institutions.
2b — Create an app and copy the Setup Token
- On your Bridge account page, find the section for apps (it may say New App or Create Setup Token); the direct address is https://beta-bridge.simplefin.org/simplefin/create. Name the app
cash-kit. - The Bridge shows one long block of letters and numbers. That is your Setup Token. Leave that browser tab open for a moment; you'll copy it in 2c.
- It goes into your own Terminal, at the hidden prompt the command below opens. Not into this page (there is no box for it, on purpose), not into an email, not into a chat, not to whoever gave you this kit.
- The moment cash-kit claims it, the token is spent. It turns into an access key that lands at
~/.config/cash-kit/simplefin_access_url— readable by your user only (chmod 600), and kept outside the kit folder so it can never be copied along with the folder. - If you ever mis-paste it, just make a new one on the Bridge site. Nothing breaks and nothing is exposed.
2c — Claim it
claim takes nothing on the command line. It asks for the token at a hidden prompt, so the token never shows on screen and never lands in your shell history.
- Copy the command below, paste it into Terminal, press return.
- Terminal answers with
Paste your SimpleFIN setup token (input is hidden), then Enter:and waits. - Go to the Bridge tab and copy the Setup Token. Click back into Terminal, press ⌘ V. Nothing appears on the line — that is expected. Press return.
cd ~/git/cash-kit && ./cash-kit claim
Paste your SimpleFIN setup token (input is hidden), then Enter: Stored access URL for beta-bridge.simplefin.org at /Users/you/.config/cash-kit/simplefin_access_url (chmod 600). Claim successful. Next: ./cash-kit pull
You can confirm the link any time (this never prints the key itself):
cd ~/git/cash-kit ./cash-kit status
access URL: configured -> https://<redacted>@beta-bridge.simplefin.org/<path-redacted> last pull: never seen ids: 0 posted, 0 pending inbox pulls: none
no token entered — you pressed return before pasting. Run the command again and paste at the prompt.
setup token is not valid base64 — the paste picked up a stray space or line break, or missed a piece. Make a new token at https://beta-bridge.simplefin.org/simplefin/create and try again (it costs nothing).
claim failed: HTTP 403 — setup tokens are single-use — that token was already used or has expired. Make a fresh one at the same address and run ./cash-kit claim again.
that looks like an ACCESS url, not a setup token — you copied a link rather than the token. The Setup Token is the long block of letters and numbers, no https:// in it.
First pull — and name your accounts
Fetches the last 44 days into plain CSV files, then asks you what to call each account.
What it does. pull asks the Bridge for balances and transactions and writes them into ledger/inbox/ as dated CSV files: 2026-09-18-simplefin.csv (transactions), -balances.csv, and -holdings.csv if a brokerage account is linked. The first time, it doesn't know what you call your accounts, so it ends with a NEW ACCOUNTS FOUND block: a small piece of valid JSON listing each account it saw.
cd ~/git/cash-kit ./cash-kit pull
Pulling since 2026-08-05 …
3 account(s); 212 new row(s) (4 pending), 0 already tracked.
Big Bank Checking: $4812.55 (as of 2026-09-18)
Big Bank Savings: $12040.00 (as of 2026-09-18)
Card Co Visa: $-1318.22 (as of 2026-09-18)
Wrote: 2026-09-18-simplefin.csv 2026-09-18-simplefin-balances.csv
NEW ACCOUNTS FOUND. Paste this into accounts.json (valid JSON), then change each
right-hand name to what you want on the page (e.g. "Checking"), then run:
./cash-kit pull --fresh
{
"ACT-0011aabb-ccdd-4eef-8899-776655443322": "Card Co Visa",
"ACT-1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d": "Big Bank Checking",
"ACT-9f8e7d6c-5b4a-4c3d-2e1f-0a9b8c7d6e5f": "Big Bank Savings"
}Reading the block. Each line pairs an account id on the left (an opaque label the Bridge assigns; it is not a secret and unlocks nothing) with the name the bank gave the account on the right. Real ids look like ACT-…; SimpleFIN's demo account uses plain names such as Demo Checking. Either way, the id is copied exactly as printed. You change only the right-hand side, to the short name you'd like on your page: Checking, Savings, Visa. Short is good; you'll type these names again in Step 4, and they must match exactly.
token is valid, but NO banks are connected yet means the claim worked but nothing is linked to it. Sign in at https://beta-bridge.simplefin.org/auth/login, connect your checking bank (Step 2a), and pull again.3a — Name each account
Shortcut: paste the NEW ACCOUNTS FOUND block here and let the page read the ids
| Account id (exactly as the pull printed it) | Name you want on the page |
|---|
3b — Export accounts.json
What will be written
(name at least one account above)
3c — Save it into the kit folder
After Copy, this one line writes the clipboard straight into the file (pbpaste means "paste the clipboard", > means "into this file"):
pbpaste > ~/git/cash-kit/accounts.json && cat ~/git/cash-kit/accounts.json
(it prints the file back to you — the same text as the preview above)
If you used Download instead, move it out of Downloads: mv ~/Downloads/accounts.json ~/git/cash-kit/
Prefer to do it by hand, without this page?
Start from the example file and open it in TextEdit: cd ~/git/cash-kit && cp accounts.example.json accounts.json && open -t accounts.json. Replace the example ACT-… line with the { … } block the pull printed, change each right-hand name, keep the quotes and commas as they were, save. Then carry on with 3d.
3d — Pull again with --fresh
The first pull filed everything under the banks' own names, and the kit remembers every transaction it has seen so it never writes a duplicate. --fresh makes it forget that first pull (the inbox feed files and the dedupe memory — never your access key) and fetch again under your names:
cd ~/git/cash-kit ./cash-kit pull --fresh
fresh pull: cleared the dedupe state and the inbox feed files Pulling since 2026-08-05 … 3 account(s); 212 new row(s) (4 pending), 0 already tracked. Checking: $4812.55 (as of 2026-09-18) Savings: $12040.00 (as of 2026-09-18) Visa: $-1318.22 (as of 2026-09-18) Wrote: 2026-09-18-simplefin.csv 2026-09-18-simplefin-balances.csv …and no NEW ACCOUNTS FOUND block at the end.
token is valid, but NO banks are connected yet — the token is fine but nothing is linked. Sign in at https://beta-bridge.simplefin.org/auth/login, connect a bank, pull again.
HTTP 403 — access token rejected — make a fresh Setup Token at https://beta-bridge.simplefin.org/simplefin/create and re-run Step 2c.
WARNING: accounts.json is invalid JSON — ignoring — a quote or comma is off (the last line must not end in a comma). Click Copy accounts.json above and run the 3c command again.
An account still shows the bank's long name, and the NEW ACCOUNTS FOUND block is back — its id in accounts.json doesn't match exactly. Paste the block into the shortcut box above rather than retyping.
Build kit.json — your plan
The one file that holds what you expect to happen. today.html walks it forward from your real balance.
What it does. kit.json tells the page which account is your checking, which bills land on fixed days, roughly what a day costs, which deposits you know are coming, and one or two what-ifs. From that it draws a five-month projection next to the actual balance. Rough numbers are fine — you'll tune them as the weeks go by, and the page always shows the bank's real balance beside the guess.
kit.json so you never have to fight a missing comma. After that, edit the file directly — open -t ~/git/cash-kit/kit.json — because Copy and Download here always write the whole file from this form and would overwrite anything you changed by hand. Two sections the form leaves at their defaults, for hand-editing later if you want them: recurring_income ({"start": "YYYY-MM-DD", "weekly_amount": 500, "count": 12, "label": "…"} — count is how many weeks; leave the list empty or use "count": 0 for none) and transfer_patterns (lowercase snippets that mark transfers and card payments so the calendar doesn't count them as spending; sensible defaults are built in).
4a — Basics
4b — Monthly bills on fixed days
Rent or mortgage, insurance, phone, utilities on autopay. Day of month 1–31; amount as a plain number (positive; it is subtracted). A bill on day 29, 30, or 31 lands on the last day of shorter months.
| Day | Amount | Label |
|---|
4c — Daily estimates
4d — Money you know is coming
Paychecks, pension, Social Security, a tax refund — with the date it lands. The page adds them on that day.
| Date | Amount | Label |
|---|
4e — What-if scenarios
Each scenario is a line on the chart. A with no events is "nothing unusual happens". Add events to B to see what a big purchase, a payoff, or a windfall does. Negative amount = money out, positive = money in.
| Date | Amount (− = out) | Label |
|---|
| Date | Amount (− = out) | Label |
|---|
4f — Credit cards on autopay
If a card pulls its minimum from checking on a fixed day, the projection should know. Each card also gets its own balance card on the page. Day 29–31 lands on the last day of shorter months.
| Card account name | Autopay day | Minimum payment |
|---|
4g — Milestones
Dates worth seeing on the chart: a trip, a renewal, the end of the year. Each one is a dashed vertical with the emoji on top.
| Date | Emoji | Label |
|---|
4h — Things not on any feed (estimates)
A pension value, a house, a private loan, cash in a drawer. They count toward net worth on the page and nothing else. Negative = a debt.
| Name | Balance |
|---|
4i — Optional: a savings floor to watch
A balance you don't want to dip below. The page shows a card that says intact or BELOW floor.
More optional settings: calendar accounts, horizon, ledger anchor
Accounts that count as spending on the calendar
How far ahead to project
Ledger anchor — optional, only if you are importing an older ledger
Leave both blank. The chart keeps its full history on its own: after a monthly ingest (Step 7) the feed files are archived, and today.html still reads them. The anchor exists only for someone bringing in a ledger/transactions.csv from somewhere else: the date of its last row, and what checking showed that day, so the chart can draw back to January 1 from it.
4j — Export kit.json
What will be written
4k — Save it into the kit folder, then check it
After Copy. The second half asks Python to read the file back; it prints OK if the file is well-formed.
pbpaste > ~/git/cash-kit/kit.json && /usr/bin/python3 -m json.tool ~/git/cash-kit/kit.json > /dev/null && echo OK
OK
If you used Download: mv ~/Downloads/kit.json ~/git/cash-kit/
OK means the clipboard didn't hold the file — click Copy kit.json again and re-run the command.Changing your mind later. Open the file and edit it in place — open -t ~/git/cash-kit/kit.json — then ./cash-kit today to see the result. Dates are YYYY-MM-DD, amounts are plain numbers, every row keeps its brackets. Come back to this form only to start over: Copy here rewrites the whole file and drops any hand edits.
The worked example, as a finished kit.json
Render your pages
Turns the feed plus your plan into today.html, spend-calendar.html, ledger.html and cards.html.
What it does. today reads the latest balances and transactions in ledger/inbox/ and your kit.json, and writes today.html: live balances with a small trend line per account, net worth, and the actual-versus-projected checking chart with your scenarios. open shows it in your browser. calendar writes the spending heat calendar.
5a — today.html
cd ~/git/cash-kit ./cash-kit today ./cash-kit open
today.html written — net worth $15,534, effective Checking $4,812.55, stale_days=0, scenario lows A=1,204, B=-2,996 …and your browser opens the page.
On the chart: the solid dark line is your real checking balance; the dashed lines are the scenarios walking forward; dashed verticals with an emoji are your milestones. Mouse wheel zooms time around the cursor, drag pans, double-click resets. A scenario that "goes negative" is the page telling you something before the bank does. A scenario outflow whose date has already passed doesn't vanish — it rolls forward to the next day, because an obligation doesn't evaporate when a date slips.
5b — spend-calendar.html
cd ~/git/cash-kit ./cash-kit calendar && open spend-calendar.html
spend-calendar.html written: 31 active days in 2026, out $3,412, in $5,200
Newest month on top, today ringed in gold. The switch at the top shows money out, money in, or both on one grid. Transfers and card payments never count in either direction.
5c — ledger.html and cards.html
cd ~/git/cash-kit ./cash-kit ledger && ./cash-kit cards && open ledger.html cards.html
The ledger is every transaction on one page — search, filter by account, category or card, sort, month subtotals. Cards are buckets you name: a trip, a project, the business. Copy cards.example.json to cards.json, give each card a name and a few match words (bits of payee names); rows that match land on the card by themselves, and the + on any ledger row puts one there by hand (in the app that saves at once; in a plain browser it's remembered by that browser). Each card's page adds it up: money out and in, a budget bar, a calendar of its days, a chart of the running net with one dotted line per category, and by-category / by-payee / by-month tables. In the app the cards are the Board: each is a post-it with its numbers; click it for the full page.
A receipt the feed never delivered? Put it in ledger/inbox/<date>-reported.csv (same columns as transactions.csv). It shows everywhere marked reported and ingest promotes it — until the bank delivers a row with the same account and amount within −3/+21 days, when the bank's row wins.
Plans (the scenarios in kit.json) are the dashed lines on the chart. In the app the Plans tab shows the chart above one card per plan with its lowest point and end number, and the steps as plain rows — change one and the chart redraws.
balances file has no 'Checking' row — check accounts.json mapping / kit.json checking_account — the Checking account name in kit.json isn't exactly one of the right-hand names in accounts.json. Make them identical (Step 3 or Step 4), save, and run today again.
two feed accounts share the same name in accounts.json — two ids map to the same right-hand name. Give each its own name, save accounts.json, then ./cash-kit pull --fresh.
kit.json not found at … — Step 4k didn't land; re-run its command.
kit.json has a JSON error at line N column M — a hand edit broke the file at that line (usually a missing comma or bracket). Fix that line, or re-export from Step 4j if you'd rather start clean. The Step 4k check (/usr/bin/python3 -m json.tool kit.json) points at the same spot; no need to paste the file into a website.
cash-kit today: a value in kit.json or accounts.json is the wrong shape — a date isn't YYYY-MM-DD, an amount has a $ or a comma in it, or a row is missing a field. Compare the row against kit.example.json.
no simplefin balances file in ledger/inbox — nothing has been pulled yet; back to Step 3.
A red feed is N day(s) stale band on the page — the checking balance date is older than today. Usually the bank's connection is running a day behind and it clears by the next morning. If it keeps climbing, the bank has asked for a fresh login: sign in at https://beta-bridge.simplefin.org/auth/login and relink that institution. Some institutions refresh slowly by design — Apple Card updates about once a month, so its sparkline sits flat for weeks; that's normal.
Automate — every morning at 9:15
macOS's own scheduler (launchd) runs pull + today + calendar daily. No extra software.
What it does. install writes one small file into ~/Library/LaunchAgents/ that tells macOS to run ./cash-kit morning at 9:15 each day. morning is just pull, then today, then calendar. Output goes to ledger/inbox/morning.log. It's safe to run install again any time; it replaces the previous copy.
cd ~/git/cash-kit ./cash-kit install
installed: com.cash-kit.morning runs './cash-kit morning' daily at 9:15 (log: ledger/inbox/morning.log) remove with: launchctl bootout gui/$(id -u)/com.cash-kit.morning && rm '/Users/you/Library/LaunchAgents/com.cash-kit.morning.plist'
macOS may show a notification that a background item was added. That's this. Confirm it's registered:
launchctl list | grep cash-kit
- 0 com.cash-kit.morning
Your Mac needs to be on at 9:15 — asleep is fine; macOS runs the job when it wakes. If it was shut down, that day is skipped; just run ./cash-kit morning yourself, or open today.html and read yesterday's.
To turn it off
launchctl bootout gui/$(id -u)/com.cash-kit.morning && rm ~/Library/LaunchAgents/com.cash-kit.morning.plist
Nothing else changes — your files and your access key stay put. Run ./cash-kit install to turn it back on.
tail -30 ~/git/cash-kit/ledger/inbox/morning.log — it shows the same messages you'd see running the commands by hand, so the fixes in Steps 3–5 apply. You can also always run ./cash-kit morning yourself.Once a month — make the ledger durable
The daily feed is provisional. ingest promotes it into one permanent, tidy file.
What it does. The daily pulls pile up dated files in ledger/inbox/. ingest takes every posted row (pending ones wait), removes duplicates, appends them to ledger/transactions.csv in date order, and moves the consumed inbox files into ledger/imports/. today.html keeps reading those archived files, so the chart loses no history when you ingest. Run it once a month, or whenever you like; it's safe to repeat.
The category column in the ledger is mostly left blank for you. ingest already tags obvious transfer legs and card payments as Transfer; the calendar skips rows categorised Transfer or CC Payment so shuffling money between your own accounts doesn't count as spending. If you fill in categories, do it in a text editor — open -t ~/git/cash-kit/ledger/transactions.csv — not Numbers or Excel, which rewrite the date column when they save.
7a — Preview, then do it
cd ~/git/cash-kit ./cash-kit ingest --dry-run
2026-08-05 -112.40 Checking SAFEWAY #1234 2026-08-05 -14.99 Visa NETFLIX.COM … 208 new row(s) would be added
cd ~/git/cash-kit ./cash-kit ingest
ledger: 208 row(s) total, 208 added; 1 inbox file(s) archived to ledger/imports/
7b — Only if you are bringing in an older ledger
Most people skip this. If you already keep a transactions file from somewhere else, you can make it the ledger: save it as ~/git/cash-kit/ledger/transactions.csv with the columns date,amount,payee,account,category,source (dates YYYY-MM-DD, money out negative, account names as in Step 3), then set the Ledger anchor in Step 4's optional settings to the date of its last row and what checking showed that day. That lets the chart draw back to January 1 from your file. Otherwise ledger_anchor stays null and everything still works.
0 new row(s) right after a pull usually just means the feed was all pending or already in the ledger. ingest only reads files named *-simplefin.csv in ledger/inbox/; if that folder is empty, there's nothing to do until tomorrow's pull.Where everything lives, and what stays out of git
The folder holds the tool. Your money lives in files the tool is told to ignore.
| Path | What it is | Git |
|---|---|---|
~/.config/cash-kit/simplefin_access_url | Your access key (the claimed token). Readable by your user only. The one thing that must never be shared. | outside the folder |
~/.config/cash-kit/simplefin_state.json | Which transactions the kit has already seen, plus when it last pulled. Do not delete it by hand — the next pull would write rows the inbox already holds. ./cash-kit pull --fresh is the reset; it clears this file and the inbox feed files together. | outside the folder |
ledger/inbox/ | The daily feed: YYYY-MM-DD-simplefin.csv (transactions), -balances.csv, -holdings.csv for brokerage accounts, plus morning.log. The Bridge's raw JSON reply is kept only if you run pull --raw. | ignored |
ledger/imports/ | Feed files already folded into the ledger by ingest. | ignored |
ledger/transactions.csv | The durable ledger. One row per posted transaction, all accounts, in date order. | ignored |
accounts.json · kit.json | Your account names and your plan (Steps 3 and 4). | ignored |
today.html · spend-calendar.html | The pages. Regenerated every morning. | ignored |
cash-kit · bin/ · install.sh · setup.html | The tool itself, plus this worksheet. | tracked |
Why. .gitignore names every file that contains your numbers. If you ever back this folder up with git, or hand the folder to someone else, the tool travels and the money doesn't — and the access key was never inside the folder to begin with.
Backing up your data means copying two things: the whole ~/git/cash-kit folder (ledger/, kit.json and accounts.json all live in it) and ~/.config/cash-kit. Time Machine to a drive you own covers both. Keep the folder out of iCloud Drive, Dropbox, Google Drive and the like — it is local only, always. Open it in Finder any time with open ~/git/cash-kit.
Editing the ledger by hand — ledger/transactions.csv is plain text; open it with a text editor (open -t, BBEdit, VS Code). Numbers and Excel will rewrite the date column when they save, and the kit will stop understanding it.
Every message the kit can print, and the fix
The same fixes as in the steps above, in one place for later.
| Message | What to do |
|---|---|
no access URL configured | Nothing has been claimed yet. ./cash-kit claim (Step 2c). |
HTTP 403 — access token rejected | Make a new Setup Token at beta-bridge.simplefin.org/simplefin/create and claim again. |
claim failed: HTTP 4xx — setup tokens are single-use | That token was used or expired. New token, claim again. |
setup token is not valid base64 | The paste picked up a stray space or line break, or missed a piece. New token at beta-bridge.simplefin.org/simplefin/create, claim again. |
no token entered | Return was pressed before pasting. ./cash-kit claim again and paste at the prompt. |
that looks like an ACCESS url, not a setup token | A link was copied instead of the token. The Setup Token is the long block of letters and numbers, no https:// in it. |
WARNING: accounts.json is invalid JSON — ignoring | A quote or comma is off (the last line must not end in a comma). Copy accounts.json from Step 3b again and run the 3c command, then ./cash-kit pull --fresh. |
token is valid, but NO banks are connected yet | Link your institutions at beta-bridge.simplefin.org/auth/login, then pull again. |
NEW ACCOUNTS FOUND (on a later pull) | An id is missing from accounts.json. Add it, then ./cash-kit pull --fresh. |
balances file has no 'X' row | Make checking_account in kit.json identical to one of the names in accounts.json. |
two feed accounts share the same name | Give each id its own name in accounts.json, then ./cash-kit pull --fresh. |
kit.json has a JSON error at line … | Fix that line, or re-export from Step 4j. The Step 4k check points at the same spot; no need to paste the file into a website. |
kit.json not found at … | Step 4k didn't land; re-run its command (or cp kit.example.json kit.json and edit by hand). |
ledger_anchor is set but ledger/transactions.csv does not exist | Either run ./cash-kit ingest (Step 7) or set ledger_anchor back to null; the page renders from the feed window meanwhile. |
only the first 3 scenarios are drawn | kit.json has more than three scenarios; the extras are ignored, not an error. |
a value in kit.json or accounts.json is the wrong shape | Dates are YYYY-MM-DD; amounts are plain numbers, no $ or commas; every row has all its fields. |
no simplefin balances file in ledger/inbox | Pull first: ./cash-kit pull. |
answered with a redirect — refusing to forward credentials | By design: the kit won't follow a redirect with your key attached. If SimpleFIN has genuinely moved, claim a fresh token. |
| Red feed is N day(s) stale band | The bank's connection at the Bridge is behind. Usually clears next morning; if it keeps climbing, sign in at the Bridge and relink that institution. Apple Card refreshes monthly, which is normal. |
| The 9:15 job didn't run | launchctl list | grep cash-kit should show com.cash-kit.morning; if not, ./cash-kit install again. If it is listed, read ledger/inbox/morning.log. |
This worksheet
Everything above is saved in this browser's storage, on this Mac: the checkmarks, the account names, the kit.json form. None of it is secret, and none of it goes anywhere.